iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
自我挑戰組

從零開始的AI學習之路:非本科轉職的30天挑戰記系列 第 12

D12 | 練習用ChatGPT的Canvas畫布功能撰寫生命靈數計算機

  • 分享至 

  • xImage
  •  

你是一個Python專家,請你幫我寫程式碼,我要做簡易的「生命靈數計算機」,input是讓用戶輸入西元生日之年月日的數字加總,得到一個最終數字1~9之間的生命靈數。
例如:20010101出生的人,生命靈數是2+0+0+1+0+1+0+1=5,為5號人;
若數字加總後大於等於10,就必須再十位數數字跟個位數數字相加直至加總值小於等於9,最終列印結果須列出十位數數字跟個位數數字加上斜線,斜線後面放生命靈數,例如:19901115為27,27是大於9,所以要再把2加上7=9,此人的生命靈數為27/9號人;若19990929出生者為48/12/3號人,要幫我寫例外判斷(不能有標點符號、月日若非十位數需要補0、不能輸入數字以外的內容)
謝謝你,麻煩你了!

以上落落長的prompt,是我跟ChatGPT的畫布Canvas討論程式碼的開頭,做一個生命靈數計算機究竟會多有效率咧?

擷取自官方2024年10月3日的Canvas介紹:

粉墨登場的 Canvas 是一款全新介面,用來與 ChatGPT 一起處理寫作和程式設計專案,功能比單純的聊天介面更強大。Canvas 會在個別視窗中開啟,方便您與 ChatGPT 協作處理專案。這個早期 Beta 版帶來全新的協作方式,不光能對話交流,還能夠像同桌工作一樣,共同創造和完善想法。
來源

Canvas的程式設計功能如下:

  • 預覽程式碼:ChatGPT 會提供逐行建議來協助改善程式碼。
  • 新增記錄:插入 print 陳述式來協助您偵錯和理解程式碼。
  • 新增註解:對程式碼新增註解來協助理解。
  • 修正錯誤:偵測並重寫有問題的程式碼來解決錯誤。
  • 移植到其他語言:將您的程式碼轉譯成 JavaScript、TypeScript、Python、Java、C++ 或 PHP。

生命靈數計算機的例外判斷很多,而且有些1999年以後出生的孩子,總數超過"9"之後相加十位數跟個位數,還是會超過"9",必須再相加第二次,例如:若19990929出生者為48/12/3號人。
來看看Canvas會如何處理吧!

首先要在對話框先選畫布功能:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974vONLYsFmWt.png

再來傳給它充分資訊的討論內容,短短幾秒內就會在側邊面板生成python程式碼:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974KFW1bAXRUQ.png

右側可以執行程式碼看看是否是我們要的:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974R3PsBNoeDe.png

第一次執行就噴錯了,它會顯示錯誤的內容為何,也可以選擇修復:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974mns7AZrOk0.png

我是先到左邊對話框跟它溝通:

The error you're encountering is an OSError: [Errno 29] I/O error, which typically occurs when attempting to perform I/O operations like input() in a sandboxed environment that restricts access to standard input/output. Since the environment you're using does not allow for user input in this manner, you may need to simulate input programmatically or find an alternative way to provide the input, such as by passing it directly within the code.
錯誤代碼如上,因為你無法模擬input,所以請你先幫我把input假設為19990929,再執行一次看看。

https://ithelp.ithome.com.tw/upload/images/20250817/20177974ZKCFY9FCVt.png

它說已經幫我測試成功,我也請它幫我跑測試案例看看,四種不同狀況的案例計算結果皆正確:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974cDniz5HACt.png

我再跟它要求:

請幫我改回有input的版本,方便我貼到colab使用,印出的結果請幫我按照下方格式並加上emoji,例如:您好✨您的生命靈數是19/10/1號人💜

def _validate_birthday(birthday: str):
    if not isinstance(birthday, str):
        return "輸入錯誤:請以字串傳入西元生日 (例如 19900101)"

    if not birthday.isdigit():
        return "輸入錯誤:請勿包含標點或空白,只能輸入數字 (例如 19900101)"

    if len(birthday) != 8:
        return "輸入錯誤:格式應為YYYYMMDD,共8位數字;月/日需補0 (例如 19900101)"

    year = int(birthday[:4])
    month = int(birthday[4:6])
    day = int(birthday[6:8])

    if not (1 <= month <= 12):
        return "輸入錯誤:月份必須在01~12之間"
    if not (1 <= day <= 31):
        return "輸入錯誤:日期必須在01~31之間"

    return year, month, day


def _sum_digit_chain_from_string(num_str: str):
    total = sum(int(ch) for ch in num_str)
    chain = [total]
    while total > 9:
        total = sum(int(ch) for ch in str(total))
        chain.append(total)
    return chain


def calc_life_path(birthday: str) -> str:
    ok = _validate_birthday(birthday)
    if isinstance(ok, str):
        return ok

    chain = _sum_digit_chain_from_string(birthday)
    return "/".join(str(n) for n in chain) + "號人"


if __name__ == "__main__":
    user_input = input("請輸入您的西元生日 (YYYYMMDD):")
    result = calc_life_path(user_input)
    if result.startswith("輸入錯誤"):
        print(result)
    else:
        print(f"您好✨您的生命靈數是{result}💜")

我將以上程式碼貼至colab測試有成功,並做了例外測試,例如8月生日我只輸入8沒有輸入08,它有糾錯:
輸入錯誤:格式應為YYYYMMDD,共8位數字;月/日需補0 (例如 19900101)

再做一個進階要求:

請新增程式碼是GRADIO介面,標題:生命靈數計算機,輸入介面跟輸出介面都用textbox,Button的label是「計算」,謝謝!

import gradio as gr

def _validate_birthday(birthday: str):
    if not isinstance(birthday, str):
        return "輸入錯誤:請以字串傳入西元生日 (例如 19900101)"

    if not birthday.isdigit():
        return "輸入錯誤:請勿包含標點或空白,只能輸入數字 (例如 19900101)"

    if len(birthday) != 8:
        return "輸入錯誤:格式應為YYYYMMDD,共8位數字;月/日需補0 (例如 19900101)"

    year = int(birthday[:4])
    month = int(birthday[4:6])
    day = int(birthday[6:8])

    if not (1 <= month <= 12):
        return "輸入錯誤:月份必須在01~12之間"
    if not (1 <= day <= 31):
        return "輸入錯誤:日期必須在01~31之間"

    return year, month, day


def _sum_digit_chain_from_string(num_str: str):
    total = sum(int(ch) for ch in num_str)
    chain = [total]
    while total > 9:
        total = sum(int(ch) for ch in str(total))
        chain.append(total)
    return chain


def calc_life_path(birthday: str) -> str:
    ok = _validate_birthday(birthday)
    if isinstance(ok, str):
        return ok

    chain = _sum_digit_chain_from_string(birthday)
    return f"您好✨您的生命靈數是{'/'.join(str(n) for n in chain)}號人💜"


def run_life_path(birthday: str):
    return calc_life_path(birthday)


iface = gr.Interface(
    fn=run_life_path,
    inputs=gr.Textbox(label="請輸入您的西元生日 (YYYYMMDD):"),
    outputs=gr.Textbox(label="結果"),
    title="生命靈數計算機",
    live=False,
    submit_btn="計算"
)

if __name__ == "__main__":
    iface.launch()

生成一次就是我指定的樣式,還不錯:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974KRHY5tzA9z.png

回到Canvas,右側還有選單可以選擇程式碼審查功能:
https://ithelp.ithome.com.tw/upload/images/20250817/20177974sH9NTiAEHS.png

按下去會跳出建議,我選擇申請「在 Gradio 介面中可考慮使用 placeholder 提示輸入範例,提升使用者體驗。」
它便將程式碼修改了。接著輸入框就多了提示範例。
https://ithelp.ithome.com.tw/upload/images/20250817/20177974CaYcxPDLv6.png

結語

✔️ 我的要求沒提到,但是它有主動做日期的例外判斷,例如:「月」必須介於1~12、「日」必須介於1~31(但是像6月是小月,我輸入0631,它不會噴錯,這個就要再額外要求它了)
✔️我的要求沒提到,但它主動做了案例測試,還做了四種,不錯!(最好是自己提供它極端值測試,譬如19990929或是20001314這種)
✔️修改完GRADIO,它有建議:「要不要我再幫你加上更多 emoji(例如根據數字不同給不同符號)?」我是覺得這樣太ㄏ一花,所以就不用了XD

覺得目前測試簡單的程式碼,互動蠻即時的,可以像「合作夥伴」一樣,逐步修改程式,適合用來學習&練習程式、快速生成範例,若比較複雜的程式碼目前還沒測試過,之後有機會再玩看看!


上一篇
D11 | 學習心得:Azure + LINE Bot打造雙向翻譯機
下一篇
D13 | (工具分享)超強AI助理NotebookLM,把文字堆變成知識庫!
系列文
從零開始的AI學習之路:非本科轉職的30天挑戰記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言